Introdução a modelos lineares mistos para os estudos da linguagem (aula 1)

Mahayana C. Godoy (PPgEL/UFRN)

16/11/2019

Para citar este material:

Godoy, M. C. (2019). Introdução aos modelos lineares mistos para os estudos da linguagem. PsyArXiv. https://doi.org/10.17605/OSF.IO/9T8UR

Apresentação: objetivo, conteúdo e materiais

Este tutorial foi pensado com o objetivo de ensinar os conceitos básicos de Modelos Lineares Mistos e sua implementação em R no ambiente do RStudio. Apesar de haver muitos tutoriais bons sobre o tema em inglês, há pouco material desse tipo produzido em português para acadêmicos que têm pouca familiaridade com estatística. Por isso, o tutorial foi pensado para um público de pesquisadores em Ciências Humanas que têm pouco ou nenhum contato com linguagem de programação e pouco conhecimento de matemática. Para acompanhar o tutorial por conta própria, você deve conhecer os conceitos de média, mediana e distribuição normal. Além disso, fica mais fácil se você souber como funciona um histograma e um boxplot.

Se você tem conhecimento avançado em estatística ou está procurando uma discussão mais profunda sobre aspectos matemáticos de modelos lineares, esse tutorial talvez não seja para você. Se você é um pesquisador com um pouco de conhecimento sobre testes de hipóteses, mas que não domina o conceito básico de modelo linear, esse material é para você. O tutorial também é útil caso você conheça o básico de modelos lineares e queira aprender a utilizar R para fazer suas análises.

Modelos lineares são empregados para lidar com uma gama muito ampla de problemas de pesquisa. Os exemplos que serão dados nesses tutoriais refletem o tipo de pesquisa que eu realizo e conheço melhor: dados experimentais coletados em pesquisa sobre processamento de linguagem. Por isso, tenha sempre em mente que há uma série de questões que não abordarei (amostragem, detecção de outliers, desenhos experimentais etc.) que têm tratamentos específicos em áreas diferentes. Conheça bem a literatura da sua área antes de planejar uma análise de dados.

Ainda que os exemplos e dados sejam específicos de uma área, o conceito básico de modelo linear pode ser generalizado para outros campos.

O tutorial está organizado em 5 seções que, de modo geral, cobrem os seguintes assuntos:

  1. Introdução ao R: manipulação e visualização de dados;

  2. Modelos lineares;

  3. Modelos lineares mistos: conceitos básicos;

  4. Modelos lineares mistos: contrastes e testes post-hoc;

  5. Modelos lineares mistos generalizados.

Para acompanhar o tutorial, você deverá

A primeira seção é uma introdução ao R e ao RStudio e aos pacotes ggplot2 e dplyr. Se você já é usuário de R e conhece os pacotes, pode seguir para a segunda seção.

Se encontrar algum erro no material, entre em contato através do e-mail mahayanag -at- gmail ou por @mahagodoy no twitter.

1. Introdução ao R: manipulação e visualização de dados

O conteúdo desta seção inclui:

  1. Reprodutibilidade na ciência

  2. R, RStudio e seu ambiente de programação

  3. Manipulação de dados usando o pacote dplyr

  4. Gráficos utilizando o pacote ggplot2

1.1 Reprodutibilidade na ciência

Na Psicologia Cognitiva, há grande debate sobre a replicabilidade dos resultados de experimentos. Muitos trabalhos não têm conseguido replicar achados amplamente divulgados na academia e na mídia, o que tem feito com que a comunidade científica busque maneiras de melhorar nossas práticas experimentais1. No contexto do que hoje chamamos de Open Science, há uma necessidade crescente de promover a transparência dos procedimentos de criação de hipóteses, coleta e análise dos resultados experimentais.

Podemos deixar nossos estudos mais transparentes criando pré-registro2 dos nossos procedimentos de coleta e análise de dados. Podemos também compartilhar nosso conjunto de dados para permitir que outros pesquisadores reproduzam nossas análises de dados e/ou identifiquem padrões ou erros que não percebemos. Ter seu trabalho questionado por outro cientista não é algo ruim ou indesejado. Pelo contrário: significa que alguém leu o que você produziu e achou interessante o suficiente para identificar erros e propôr soluções que podem ampliar a compreensão do fenômeno estudado.

Hoje, há uma série de programas disponíveis para realização de análises estatísticas, como Excel, SPSS, STATA, Minitab etc. Se a seção de análise de dados de um artigo é bem escrita, ela deve ter informações que permitam a reprodução de seus resultados por outra pessoa que queira usar qualquer um desses programas. No entanto, as análises feitas a partir desses programas seguem um procedimento de point-and-click, o que torna mais difícil (e demorada) a reprodução das análises se algum detalhe deixou de ser descrito.

Nesse contexto, o uso de linguagens de programação apresenta a vantagem de permitir a reprodutibilidade das análises realizadas de modo mais transparente e mais fácil, sem custos maiores para quem está auditando a análise. Ao compartilharmos nosso código, fica fácil para nossos pares (pareceristas ou não) seguirem todos os passos da nossa análise e identificarem possíveis erros. O uso de linguagens de programação também permite que anotemos nossas decisões no próprio código. Isso permite que, anos depois, lembremos porque tomamos determinadas decisões durante nossa análise.

Embora haja outras linguagens de programação que podem ser usadas para análise de dados, esse tutorial elege o R. Para entender um pouco como essa linguagem funciona, precisamos conhecer também o RStudio, o ambiente de programação que usaremos ao longo do tutorial.

1.2 R, RStudio e seu Ambiente de Programação

Nesse tutorial, usamos o ambiente RStudio para escrever e rodar nossos códigos. Ele é uma interface que permite escrever o código e ver seus resultados em quatro paineis diferentes.

A cada novo grande trabalho de análise de dados (um mestrado, um doutorado, uma consultoria específica, um artigo etc.), é recomendado que você crie um novo projeto no R, uma espécie de pasta para reunir os arquivos de dados e códigos de análise desse projeto específico. Vamos aprender a fazer isso agora, criando um projeto para esse tutorial.

Abra o RStudio. Se tudo deu certo, você verá uma imagem parecida com essa:


Figura 1.1: Tela do RStudio


Vá em File > New Project e selecione New Directory para criar um diretório novo.


Figura 1.2: Criando projeto em Novo diretório


Vamos criar um novo projeto no R, uma pasta onde colocaremos todos os arquivos necessários para o curso. Para isso, selecione Empty Project


Figura 1.3: Selecionando a opção Empty Project


Em seguida, escolha a pasta onde você vai guardar desse projeto e escolha um nome para ele (eu o chamei de TutoriaRMLM e guardei na minha pasta de cursos).


Figura 1.4: Nomear novo diretório


Importe para essa nova pasta os materiais do tutorial que você baixou. São eles:

  1. a pasta dados, com os conjuntos de dados que utilizaremos;

  2. a pasta scripts, que contem os códigos em arquivo .R para acompanhar cada seção do tutorial e a pasta tarefas, com os gabaritos e respostas das tarefas práticas de cada seção;

  3. a pasta arquivos_html, que apresenta cada uma das seções deste tutorial em formato html, para quem preferir acompanhar numa versão visualmente mais agradável.

Após importar todos os conjuntos de dados, você verá que as pastas dados, scripts e arquivos_html agora estão na aba Files no painel inferior direito do RStudio. Se não estiverem lá, é porque você não colocou as pastas dentro do arquivo correto. Confira esse passo.


Figura 1.5: Tela inicial do novo projeto


Para abrir um script de extensão .R, que é um script de código executável em R, basta ir na pasta em que eles estão e abrir. Vamos abrir aqui o script da primeira seção do tutorial, chamado Aula1_MLM.R. Clique na pasta de scripts dentro do RStudio e abra-o.


INSERIR IMAGEM DEPOIS

Figura 1.6: Tela inicial do tutorial


Ao abrir o script, você viu que sua tela ficou dividia em quatro painéis. Tomando a Figura 1.6 como referência, temos:

Em um projeto R, a aba Files mostra os arquivos presentes na pasta. Para você voltar ao diretório anterior nessa aba, clique nos dois pontos ao lado da flecha verde que fica acima da lista de arquivos. Faça isso para voltar ao diretório raiz do projeto R que acabamos de criar.

Agora que você já está com o script da primeira seção aberto, podemos ver como o R funciona.

1.3 Como o R funciona

As primeiras linhas do seu código tratam da instalação de dois pacotes que são usados na primeira seção deste tutorial: dplyr e ggplot2. O R é uma linguagem de programação que executa funções que você escreve ou que estão previstas em um de seus inúmeros pacotes. Alguns pacotes servem para análise estatística, outros para manipulação ou viasualização de dados, alguns para produzir apresentações de slides, documentos em html ou pdf (o material deste tutorial foi todo feito com R!). Usamos a função install.packages() para instalar os dois pacotes que vamos usar nesta seção. Para executar o código, deixe o cursor (aquela barrinha vertical que fica piscando) na linha do comando que deseja executar e aperte CTRL+ENTER.


# baixar pacotes

install.packages("dplyr")
install.packages("ggplot2")

Uma vez que você baixe um pacote do R, você não precisa mais instalá-lo (a menos que você formate o computador ou que saia uma versão atualizada do pacote). No entanto, toda vez que você iniciar uma seção nova do RStudio ou do R, você precisará carregar os pacotes através da função library(). Como sabemos que vamos usar esses pacotes mais adiante no tutorial, já vamos carregá-los aqui (para fins de organização, é sempre bom deixar no topo do seu código todos os pacotes que precisam ser carregados ao longo do trabalho).


# carregar pacotes

library(dplyr)
library(ggplot2)

Quando organizamos nossos códigos, é importante comentá-los para que outras pessoas (e nós mesmos) entendamos o que está sendo feito ali. Para criar um comentário (ou seja, uma linha que não é entendida como um código executável), você precisa iniciar a linha com o símbolo #

## Tudo que for precedido pelo símbolo # em uma linha é classificado como  comentário

## Comentários não são entendidos como código, e portanto o programa não tentará executá-los

O código executável é inserido em um linha nova, e seu output mostrado em um dos dois paineis da parte inferior da tela. Abaixo vamos executar a equação 2+2. Como o resultado dela é um valor numérico, aparecerá na aba prompt.

## Essa linha é um comentário. A linha abaixo é um comando. Deixe o cursor (aquela barrinha vertical que fica piscando) na linha do comando que deseja executar e aperte CTRL+ENTER. Tente fazer isso com o comando da linha abaixo.

2+2
#> [1] 4

Acima, fizemos uma operação matemática. Podemos fazer operações matemáticas a partir de funções. Por exemplo, abaixo usamos a função sqrt() para calcular a raiz quadrada de 4. Dizemos aqui que 4 é o argumento da função sqrt().

# calculando a raiz quadrada de 4

sqrt(4)
#> [1] 2

A função c(x, y, z) cria um vetor com os elementos x, y e z. Os códigos abaixo criam um vetor chamado idade com a idade de 4 pessoas e um vetor chamado nome com os nomes de 4 pessoas (quando criar vetores não-numéricos, não se esqueça de colocar o valor entre aspas duplas, como "x").

Ao criar esses vetores, você verá que eles aparecem como um novo objeto na área Environment, à esquerda.

ATENÇÃO! Para criar um novo objeto x que contenha o resultado de uma função, você pode usar <-, como em x <- f(y) ou =, como em x = f(y).


# criando um vetor com 4 valores

idade <- c(34, 35, 39, 42)

# criar um vetor com 4 nomes

nomes <- c("José", "Maria", "Ana", "Pedro")

Algumas das funções mais comuns são mean(), median() e sd(), que retornam a média, mediana e desvio-padrão de um conjunto de dados. A seguir, extraímos a média, mediana e desvio padrão do conjunto de dados idade.

# extraindo a média de idade

mean(idade)
#> [1] 37.5

# extraindo a mediana de idade

median(idade)
#> [1] 37

# extraindo o desvio-padrão de idade

sd(idade)
#> [1] 3.696846

Quando tentamos extrair as mesmas informações da coluna nome, recebemos uma mensagem de erro: argument is not numeric or logical: returning NA[1] NA. Isso ocorre porque o argumento dessas funções deve ter natureza numérica, e a mensagem de erro nos diz que esse não é o caso para o vetor nomes.

ATENÇÃO! Sempre que receber uma mensagem de erro ao rodar seu código, leia-a atentamente. Ela geralmente te informa o que há de errado com seu código. Se você não souber interpretá-la, jogue-a no google: alguém já teve sua dúvida.

# extraindo a média de nomes

mean(nomes)
#> Warning in mean.default(nomes): argument is not numeric or logical:
#> returning NA
#> [1] NA

# extraindo a mediana de nomes

median(nomes)
#> Warning in mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]):
#> argument is not numeric or logical: returning NA
#> [1] NA

# extraindo o desvio-padrão de nomes

sd(nomes)
#> Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm
#> = na.rm): NAs introduced by coercion
#> [1] NA

É possível salvar o resultado de qualquer função em um objeto de nome a sua escolha, e esses objetos são salvos na área Environment. Não use espaços, acentos e caracteres especiais no nome. Para não se confundir, não use maiúsculas: o R diferencia maísculas de minúsculas.


# criando um objeto com os resultados de uma função

media = mean(idade)
mediana = median(idade)
desvio.padrao = sd(idade)

# inspecionando os objetos criados

media
#> [1] 37.5
mediana
#> [1] 37
desvio.padrao
#> [1] 3.696846

1.4 Manipulando conjuntos de dados

Até agora usamos o R como calculadora de contas simples, mas é claro que não é esse o uso que fazemos dele. Quando fazemos uma análise estatística, geralmente seguimos alguns passos:

  1. arrumamos os dados em um conjunto de dados, geralmente uma planilha;
  2. inspecionamos os dados para ver a distribuição de dados;
  3. excluímos alguns dados que julgamos relevante suprimir;
  4. fazemos uma análise estatística dos dados.

Vamos começar pelo primeiro passo, entendendo exatamente o que é uma planilha e como podemos importá-la para o R.

1.4.1 Dataframes: importando e conhecendo seu conjunto de dados

Anteriormente, criamos um vetor chamado idade e um chamado nome. Um vetor é uma lista de elementos, todos do mesmo tipo. Com o comando data.frame(), podemos unir esses dois vetores em um dataframe.


# criando um dataframe

df = data.frame(nomes, idade)

Você pode clicar no objeto df que acabamos de criar e verá que ele é uma tabela composta pelos dois vetores que tínhamos anteriormente. Para aplicar uma função a um vetor específico de um dataframe, usamos o símbolo $. Abaixo, conseguimos extrair a média do vetor idade do dataframe chamado df.


# média de idade

median(df$idade)
#> [1] 37

Geralmente, quando trabalhamos com conjuntos de dados, eles estão organizados em dataframes. Para aprendermos a importar dataframes para o R, manipulá-los e extrair suas informações, vamos usar o conjunto de dados linguistas.csv. Esse conjunto de dados tem informações sobre os linguistas de 4 universidades (UFRN, UFMG e Unicamp) e foi coletado em julho de 2019. Como ele tem extensão .csv, vamos importá-lo usando a função read.csv(). Perceba que o argumento da função é o “endereço” do arquivo: ele está dentro da pasta dados, e por isso o argumento da função é "dados/linguistas.csv".


# criando o conjunto de dados chamado linguistas.total com todos os dados da planilha linguistas.csv

linguistas.total = read.csv("dados/linguistas.csv")

ATENÇÃO! Para importar conjuntos de dados com outra extensão, como .xlsx ou .txt, você precisará usar outras funções, mas de uma maneira semelhante a que acabamos de fazer. No nosso tutorial usaremos apenas arquivos .csv.

Agora que importamos o conjunto de dados, vamos ver o seu conteúdo. Você pode fazer isso usando uma das opções abaixo:



# Use a função head() para ver as linhas iniciais do conjunto de dados

head(linguistas.total)
#>      genero idade altura altura.2 peso tamanho.pe instituicao  dialeto
#> 1  Feminino    33    157      157   54         35        UFRN  Bolacha
#> 2  Feminino    23    167      167   67         36     Unicamp  Bolacha
#> 3  Feminino    49    158      158   50         33        UFMG Biscoito
#> 4  Feminino    23    164      164   54         36        UFMG Biscoito
#> 5 Masculino    28    166      166   75         38     Unicamp  Bolacha
#> 6 Masculino    24    174      174   57         41        UFMG Biscoito
#>                deslocamento    status esporte
#> 1 veículo próprio ou carona professor     Sim
#> 2 veículo próprio ou carona     aluno     Não
#> 3 veículo próprio ou carona     aluno     Sim
#> 4                     outro     aluno     Sim
#> 5                      à pé     aluno     Sim
#> 6        transporte público     aluno     Não

## Use a função str() para conhecer o conjunto de dados (informação sobre número de níveis, se o vetor é numérico ou não)

str(linguistas.total)
#> 'data.frame':    67 obs. of  11 variables:
#>  $ genero      : Factor w/ 2 levels "Feminino","Masculino": 1 1 1 1 2 2 1 2 1 1 ...
#>  $ idade       : int  33 23 49 23 28 24 41 35 53 33 ...
#>  $ altura      : int  157 167 158 164 166 174 160 172 163 167 ...
#>  $ altura.2    : int  157 167 158 164 166 174 160 172 163 167 ...
#>  $ peso        : int  54 67 50 54 75 57 60 85 58 64 ...
#>  $ tamanho.pe  : int  35 36 33 36 38 41 36 42 36 38 ...
#>  $ instituicao : Factor w/ 4 levels "Outra","UFMG",..: 3 4 2 2 4 2 4 4 2 3 ...
#>  $ dialeto     : Factor w/ 2 levels "Biscoito","Bolacha": 2 2 1 1 2 1 2 1 2 1 ...
#>  $ deslocamento: Factor w/ 4 levels "à pé","outro",..: 4 4 4 2 1 3 4 1 3 3 ...
#>  $ status      : Factor w/ 2 levels "aluno","professor": 2 1 1 1 1 1 2 2 1 1 ...
#>  $ esporte     : Factor w/ 2 levels "Não","Sim": 2 1 2 2 2 1 1 2 2 2 ...

# Clique no conjunto na área Environment para abrir o conjunto de dados em forma de planilha

Esse conjunto de dados contém 11 variáveis:

genero: gênero do participante (apenas participantes de dois gêneros tiveram interesse em responder o questionário)

idade: idade do participante

altura: altura do participante em cm

altura.2: repetição da coluna altura

peso: peso do participante em kg

tamanho.pe: número do calçado do participante

instituicao: instituição onde o participante estuda/trabalha

dialeto: se o participante se refere a um pacote de passatempo como biscoito ou bolacha

deslocamento: como o participante se desloca até a universidade

status: posição do participante na universidade

esporte: se o participante pratica esportes

1.4.2 Dataframes: manipulando seu conjunto de dados

Imagine que queremos conhecer a população de linguistas da UFRN, Unicamp e UFMG. Primeiro precisamos garantir que haja apenas linguistas dessas instituições na nossa tabela. Além disso, queremos apenas participantes sejam alunos ou professores dessas instituições. A função unique() nos ajuda a ver os valores únicos do vetor de um dataframe.


# usando a função unique para ver todos os valores únicos da coluna *instituicao* no conjunto de dados

unique(linguistas.total$instituicao)
#> [1] UFRN    Unicamp UFMG    Outra  
#> Levels: Outra UFMG UFRN Unicamp

# usando a função unique para ver todos os valores únicos da coluna *status* no conjunto de dados

unique(linguistas.total$status)
#> [1] professor aluno    
#> Levels: aluno professor

Nosso primeiro problema será excluir a ocorrência de pessoas de outras instituições. Já que vamos limpar o conjunto de dados, também convém excluir a coluna altura.2, que é uma replicação da coluna altura.

Para fazer essas duas tarefas, usaremos o pacote dplyr, que nos ajuda a selecionar colunas e linhas a nossa escolha, criar tabelas para resumir os dados, mudar o formato do dataframe e várias outras funções. O dplyr possui funções bastante simples, mas que se usadas recursivamente, produzem resultados bastante variados.

As funções que vamos usar são:

Vamos começar com a função select() para selecionar todas as colunas que usaremos, exceto a coluna altura.2. Rode o código abaixo e perceba que o resultado é a mesma planilha que tínhamos antes, mas sem a coluna altura.2.


# selecionando apenas as colunas de interesse para o projeto

linguistas.total%>%
  select(genero, idade, altura, peso, tamanho.pe, instituicao, dialeto, deslocamento, status, esporte)
#>       genero idade altura peso tamanho.pe instituicao  dialeto
#> 1   Feminino    33    157   54         35        UFRN  Bolacha
#> 2   Feminino    23    167   67         36     Unicamp  Bolacha
#> 3   Feminino    49    158   50         33        UFMG Biscoito
#> 4   Feminino    23    164   54         36        UFMG Biscoito
#> 5  Masculino    28    166   75         38     Unicamp  Bolacha
#> 6  Masculino    24    174   57         41        UFMG Biscoito
#> 7   Feminino    41    160   60         36     Unicamp  Bolacha
#> 8  Masculino    35    172   85         42     Unicamp Biscoito
#> 9   Feminino    53    163   58         36        UFMG  Bolacha
#> 10  Feminino    33    167   64         38        UFRN Biscoito
#> 11  Feminino    25    151   54         35        UFMG Biscoito
#> 12  Feminino    19    160   50         36        UFMG Biscoito
#> 13  Feminino    21    156   63         37        UFMG Biscoito
#> 14  Feminino    28    161   57         35        UFMG Biscoito
#> 15  Feminino    26    151   56         35        UFRN Biscoito
#> 16  Feminino    39    168   70         37        UFRN Biscoito
#> 17 Masculino    31    180  102         41     Unicamp  Bolacha
#> 18  Feminino    35    163   85         78        UFMG Biscoito
#> 19  Feminino    23    150   56         34        UFRN Biscoito
#> 20  Feminino    21    165   57         37        UFRN Biscoito
#> 21  Feminino    21    157   62         37        UFMG  Bolacha
#> 22 Masculino    37    172   75         42        UFRN Biscoito
#> 23  Feminino    21    162   55         36        UFRN Biscoito
#> 24 Masculino    26    178   90         41        UFRN Biscoito
#> 25  Feminino    39    163   53         35     Unicamp Biscoito
#> 26  Feminino    45    168   62         37        UFMG Biscoito
#> 27  Feminino    20    157   59         34     Unicamp  Bolacha
#> 28 Masculino    31    174   75         39     Unicamp Biscoito
#> 29 Masculino    22    165   77         39     Unicamp  Bolacha
#> 30  Feminino    28    161   60         35        UFRN Biscoito
#> 31 Masculino    21    168   70         38        UFRN Biscoito
#> 32  Feminino    37    165   68         37        UFRN  Bolacha
#> 33  Feminino    23    155   65         35       Outra Biscoito
#> 34  Feminino    56    165   61         37     Unicamp  Bolacha
#> 35 Masculino    44    160   79         36        UFMG Biscoito
#> 36  Feminino    39    165   92         38        UFMG Biscoito
#> 37  Feminino    29    167   64         38       Outra Biscoito
#> 38  Feminino    33    162   80         36       Outra  Bolacha
#> 39  Feminino    27    155   58         36        UFMG  Bolacha
#> 40 Masculino    24    184   74         40        UFMG  Bolacha
#> 41 Masculino    31    168   68         38        UFMG  Bolacha
#> 42 Masculino    32    182   95         42        UFMG  Bolacha
#> 43  Feminino    21    168   62         37       Outra Biscoito
#> 44  Feminino    24    160   70         35        UFRN Biscoito
#> 45 Masculino    32    173   82         40        UFRN Biscoito
#> 46  Feminino    22    165   63         36        UFRN  Bolacha
#> 47 Masculino    26    178   58         43        UFMG Biscoito
#> 48  Feminino    22    175   89         38        UFMG  Bolacha
#> 49 Masculino    24    175   63         39     Unicamp  Bolacha
#> 50  Feminino    24    155   50         34     Unicamp  Bolacha
#> 51  Feminino    21    161   65         36     Unicamp  Bolacha
#> 52  Feminino    27    152   60         35        UFMG Biscoito
#> 53  Feminino    30    163   90         37        UFMG Biscoito
#> 54 Masculino    25    175   90         39        UFMG Biscoito
#> 55 Masculino    29    167   75         38        UFRN Biscoito
#> 56  Feminino    39    162   50         35        UFMG Biscoito
#> 57  Feminino    38    152   61         34       Outra Biscoito
#> 58  Feminino    28    173   87         38        UFMG Biscoito
#> 59 Masculino    25    179   95         40     Unicamp  Bolacha
#> 60  Feminino    18    160   52         36        UFMG Biscoito
#> 61 Masculino    22    181   86         41        UFMG  Bolacha
#> 62 Masculino    24    178   82         41        UFRN Biscoito
#> 63  Feminino    25    163   57         36        UFMG Biscoito
#> 64  Feminino    41    161   80         38        UFMG Biscoito
#> 65  Feminino    20    165  100         37        UFMG Biscoito
#> 66  Feminino    36    167   80         38     Unicamp  Bolacha
#> 67 Masculino    27    181   90         41     Unicamp  Bolacha
#>                 deslocamento    status esporte
#> 1  veículo próprio ou carona professor     Sim
#> 2  veículo próprio ou carona     aluno     Não
#> 3  veículo próprio ou carona     aluno     Sim
#> 4                      outro     aluno     Sim
#> 5                       à pé     aluno     Sim
#> 6         transporte público     aluno     Não
#> 7  veículo próprio ou carona professor     Não
#> 8                       à pé professor     Sim
#> 9         transporte público     aluno     Sim
#> 10        transporte público     aluno     Sim
#> 11 veículo próprio ou carona     aluno     Sim
#> 12 veículo próprio ou carona     aluno     Não
#> 13        transporte público     aluno     Sim
#> 14        transporte público     aluno     Sim
#> 15 veículo próprio ou carona     aluno     Não
#> 16 veículo próprio ou carona professor     Sim
#> 17        transporte público     aluno     Sim
#> 18 veículo próprio ou carona     aluno     Sim
#> 19        transporte público     aluno     Sim
#> 20        transporte público     aluno     Não
#> 21                      à pé     aluno     Não
#> 22 veículo próprio ou carona professor     Sim
#> 23        transporte público     aluno     Não
#> 24        transporte público     aluno     Sim
#> 25 veículo próprio ou carona professor     Sim
#> 26 veículo próprio ou carona professor     Sim
#> 27                      à pé     aluno     Não
#> 28 veículo próprio ou carona     aluno     Não
#> 29                      à pé     aluno     Não
#> 30        transporte público     aluno     Sim
#> 31 veículo próprio ou carona     aluno     Não
#> 32 veículo próprio ou carona professor     Não
#> 33 veículo próprio ou carona     aluno     Não
#> 34 veículo próprio ou carona professor     Sim
#> 35        transporte público     aluno     Não
#> 36 veículo próprio ou carona     aluno     Não
#> 37 veículo próprio ou carona     aluno     Sim
#> 38 veículo próprio ou carona     aluno     Sim
#> 39                     outro     aluno     Sim
#> 40                      à pé     aluno     Não
#> 41                      à pé professor     Sim
#> 42                      à pé     aluno     Não
#> 43        transporte público     aluno     Sim
#> 44        transporte público     aluno     Sim
#> 45        transporte público     aluno     Sim
#> 46        transporte público     aluno     Sim
#> 47        transporte público     aluno     Não
#> 48                      à pé     aluno     Sim
#> 49        transporte público     aluno     Não
#> 50        transporte público     aluno     Não
#> 51                      à pé     aluno     Não
#> 52        transporte público     aluno     Não
#> 53        transporte público     aluno     Sim
#> 54 veículo próprio ou carona     aluno     Sim
#> 55 veículo próprio ou carona     aluno     Sim
#> 56 veículo próprio ou carona     aluno     Sim
#> 57 veículo próprio ou carona     aluno     Não
#> 58        transporte público     aluno     Não
#> 59                      à pé     aluno     Sim
#> 60 veículo próprio ou carona     aluno     Não
#> 61                     outro     aluno     Não
#> 62 veículo próprio ou carona     aluno     Sim
#> 63 veículo próprio ou carona     aluno     Sim
#> 64 veículo próprio ou carona     aluno     Não
#> 65        transporte público     aluno     Não
#> 66                      à pé     aluno     Não
#> 67                      à pé     aluno     Não

Se você prestar atenção ao código, verá que usando uma nova função, representada pelo símbolo %>%. Essa função se chama pipe e serve para levar o output de um comando para outro. Dito de outro modo, dizemos que o pipe pega o resultado de uma linha do código e usa como input para a função que está na linha subsequente. No exemplo acima, a primeira linha apenas seleciona o conjunto de dados linguistas.total, e a esse resultado aplica a função select().

Para entender o que o pipe faz, analisemos mais um exemplo. Dessa vez queremos filtrar apenas as informações de linguistas da UFRN, Unicamp e UFMG. Para isso, usamos o pipe com a função filter. A linha de filter do código abaixo pode ser lida como:

Note que o símbolo |, no código abaixo, corresponde ao operador lógico ou.


# selecionando apenas participantes que indicaram que trabalham/estudam na Unicamp *OU* na UFMG *OU* na UFRN

# Marcador | indica "ou"

linguistas.total%>%
  filter(instituicao == "UFRN" | instituicao == "UFMG" | instituicao == "Unicamp")
#>       genero idade altura altura.2 peso tamanho.pe instituicao  dialeto
#> 1   Feminino    33    157      157   54         35        UFRN  Bolacha
#> 2   Feminino    23    167      167   67         36     Unicamp  Bolacha
#> 3   Feminino    49    158      158   50         33        UFMG Biscoito
#> 4   Feminino    23    164      164   54         36        UFMG Biscoito
#> 5  Masculino    28    166      166   75         38     Unicamp  Bolacha
#> 6  Masculino    24    174      174   57         41        UFMG Biscoito
#> 7   Feminino    41    160      160   60         36     Unicamp  Bolacha
#> 8  Masculino    35    172      172   85         42     Unicamp Biscoito
#> 9   Feminino    53    163      163   58         36        UFMG  Bolacha
#> 10  Feminino    33    167      167   64         38        UFRN Biscoito
#> 11  Feminino    25    151      151   54         35        UFMG Biscoito
#> 12  Feminino    19    160      160   50         36        UFMG Biscoito
#> 13  Feminino    21    156      156   63         37        UFMG Biscoito
#> 14  Feminino    28    161      161   57         35        UFMG Biscoito
#> 15  Feminino    26    151      151   56         35        UFRN Biscoito
#> 16  Feminino    39    168      168   70         37        UFRN Biscoito
#> 17 Masculino    31    180      180  102         41     Unicamp  Bolacha
#> 18  Feminino    35    163      163   85         78        UFMG Biscoito
#> 19  Feminino    23    150      150   56         34        UFRN Biscoito
#> 20  Feminino    21    165      165   57         37        UFRN Biscoito
#> 21  Feminino    21    157      157   62         37        UFMG  Bolacha
#> 22 Masculino    37    172      172   75         42        UFRN Biscoito
#> 23  Feminino    21    162      162   55         36        UFRN Biscoito
#> 24 Masculino    26    178      178   90         41        UFRN Biscoito
#> 25  Feminino    39    163      163   53         35     Unicamp Biscoito
#> 26  Feminino    45    168      168   62         37        UFMG Biscoito
#> 27  Feminino    20    157      157   59         34     Unicamp  Bolacha
#> 28 Masculino    31    174      174   75         39     Unicamp Biscoito
#> 29 Masculino    22    165      165   77         39     Unicamp  Bolacha
#> 30  Feminino    28    161      161   60         35        UFRN Biscoito
#> 31 Masculino    21    168      168   70         38        UFRN Biscoito
#> 32  Feminino    37    165      165   68         37        UFRN  Bolacha
#> 33  Feminino    56    165      165   61         37     Unicamp  Bolacha
#> 34 Masculino    44    160      160   79         36        UFMG Biscoito
#> 35  Feminino    39    165      165   92         38        UFMG Biscoito
#> 36  Feminino    27    155      155   58         36        UFMG  Bolacha
#> 37 Masculino    24    184      184   74         40        UFMG  Bolacha
#> 38 Masculino    31    168      168   68         38        UFMG  Bolacha
#> 39 Masculino    32    182      182   95         42        UFMG  Bolacha
#> 40  Feminino    24    160      160   70         35        UFRN Biscoito
#> 41 Masculino    32    173      173   82         40        UFRN Biscoito
#> 42  Feminino    22    165      165   63         36        UFRN  Bolacha
#> 43 Masculino    26    178      178   58         43        UFMG Biscoito
#> 44  Feminino    22    175      175   89         38        UFMG  Bolacha
#> 45 Masculino    24    175      175   63         39     Unicamp  Bolacha
#> 46  Feminino    24    155      155   50         34     Unicamp  Bolacha
#> 47  Feminino    21    161      161   65         36     Unicamp  Bolacha
#> 48  Feminino    27    152      152   60         35        UFMG Biscoito
#> 49  Feminino    30    163      163   90         37        UFMG Biscoito
#> 50 Masculino    25    175      175   90         39        UFMG Biscoito
#> 51 Masculino    29    167      167   75         38        UFRN Biscoito
#> 52  Feminino    39    162      162   50         35        UFMG Biscoito
#> 53  Feminino    28    173      173   87         38        UFMG Biscoito
#> 54 Masculino    25    179      179   95         40     Unicamp  Bolacha
#> 55  Feminino    18    160      160   52         36        UFMG Biscoito
#> 56 Masculino    22    181      181   86         41        UFMG  Bolacha
#> 57 Masculino    24    178      178   82         41        UFRN Biscoito
#> 58  Feminino    25    163      163   57         36        UFMG Biscoito
#> 59  Feminino    41    161      161   80         38        UFMG Biscoito
#> 60  Feminino    20    165      165  100         37        UFMG Biscoito
#> 61  Feminino    36    167      167   80         38     Unicamp  Bolacha
#> 62 Masculino    27    181      181   90         41     Unicamp  Bolacha
#>                 deslocamento    status esporte
#> 1  veículo próprio ou carona professor     Sim
#> 2  veículo próprio ou carona     aluno     Não
#> 3  veículo próprio ou carona     aluno     Sim
#> 4                      outro     aluno     Sim
#> 5                       à pé     aluno     Sim
#> 6         transporte público     aluno     Não
#> 7  veículo próprio ou carona professor     Não
#> 8                       à pé professor     Sim
#> 9         transporte público     aluno     Sim
#> 10        transporte público     aluno     Sim
#> 11 veículo próprio ou carona     aluno     Sim
#> 12 veículo próprio ou carona     aluno     Não
#> 13        transporte público     aluno     Sim
#> 14        transporte público     aluno     Sim
#> 15 veículo próprio ou carona     aluno     Não
#> 16 veículo próprio ou carona professor     Sim
#> 17        transporte público     aluno     Sim
#> 18 veículo próprio ou carona     aluno     Sim
#> 19        transporte público     aluno     Sim
#> 20        transporte público     aluno     Não
#> 21                      à pé     aluno     Não
#> 22 veículo próprio ou carona professor     Sim
#> 23        transporte público     aluno     Não
#> 24        transporte público     aluno     Sim
#> 25 veículo próprio ou carona professor     Sim
#> 26 veículo próprio ou carona professor     Sim
#> 27                      à pé     aluno     Não
#> 28 veículo próprio ou carona     aluno     Não
#> 29                      à pé     aluno     Não
#> 30        transporte público     aluno     Sim
#> 31 veículo próprio ou carona     aluno     Não
#> 32 veículo próprio ou carona professor     Não
#> 33 veículo próprio ou carona professor     Sim
#> 34        transporte público     aluno     Não
#> 35 veículo próprio ou carona     aluno     Não
#> 36                     outro     aluno     Sim
#> 37                      à pé     aluno     Não
#> 38                      à pé professor     Sim
#> 39                      à pé     aluno     Não
#> 40        transporte público     aluno     Sim
#> 41        transporte público     aluno     Sim
#> 42        transporte público     aluno     Sim
#> 43        transporte público     aluno     Não
#> 44                      à pé     aluno     Sim
#> 45        transporte público     aluno     Não
#> 46        transporte público     aluno     Não
#> 47                      à pé     aluno     Não
#> 48        transporte público     aluno     Não
#> 49        transporte público     aluno     Sim
#> 50 veículo próprio ou carona     aluno     Sim
#> 51 veículo próprio ou carona     aluno     Sim
#> 52 veículo próprio ou carona     aluno     Sim
#> 53        transporte público     aluno     Não
#> 54                      à pé     aluno     Sim
#> 55 veículo próprio ou carona     aluno     Não
#> 56                     outro     aluno     Não
#> 57 veículo próprio ou carona     aluno     Sim
#> 58 veículo próprio ou carona     aluno     Sim
#> 59 veículo próprio ou carona     aluno     Não
#> 60        transporte público     aluno     Não
#> 61                      à pé     aluno     Não
#> 62                      à pé     aluno     Não

Ao rodar o código acima, você verá que permaneceram na planilha de resultado apenas as observações de linguistas cujo valor da coluna instituicao era “UFMG”, “UFRN” e “Unicamp”.

Outra maneira de pedirmos a mesma seleção, obtendo o mesmo resultado, é informando que queremos a seleção de qualquer valor na coluna instituição que seja diferente de “Outra”. Rode o código abaixo e perceba que o resultado é o mesmo que obtivemos com o código anterior.


# Selecionando participantes de todas as universidades diferentes de Outra

linguistas.total%>%
  filter(instituicao != "Outra")
#>       genero idade altura altura.2 peso tamanho.pe instituicao  dialeto
#> 1   Feminino    33    157      157   54         35        UFRN  Bolacha
#> 2   Feminino    23    167      167   67         36     Unicamp  Bolacha
#> 3   Feminino    49    158      158   50         33        UFMG Biscoito
#> 4   Feminino    23    164      164   54         36        UFMG Biscoito
#> 5  Masculino    28    166      166   75         38     Unicamp  Bolacha
#> 6  Masculino    24    174      174   57         41        UFMG Biscoito
#> 7   Feminino    41    160      160   60         36     Unicamp  Bolacha
#> 8  Masculino    35    172      172   85         42     Unicamp Biscoito
#> 9   Feminino    53    163      163   58         36        UFMG  Bolacha
#> 10  Feminino    33    167      167   64         38        UFRN Biscoito
#> 11  Feminino    25    151      151   54         35        UFMG Biscoito
#> 12  Feminino    19    160      160   50         36        UFMG Biscoito
#> 13  Feminino    21    156      156   63         37        UFMG Biscoito
#> 14  Feminino    28    161      161   57         35        UFMG Biscoito
#> 15  Feminino    26    151      151   56         35        UFRN Biscoito
#> 16  Feminino    39    168      168   70         37        UFRN Biscoito
#> 17 Masculino    31    180      180  102         41     Unicamp  Bolacha
#> 18  Feminino    35    163      163   85         78        UFMG Biscoito
#> 19  Feminino    23    150      150   56         34        UFRN Biscoito
#> 20  Feminino    21    165      165   57         37        UFRN Biscoito
#> 21  Feminino    21    157      157   62         37        UFMG  Bolacha
#> 22 Masculino    37    172      172   75         42        UFRN Biscoito
#> 23  Feminino    21    162      162   55         36        UFRN Biscoito
#> 24 Masculino    26    178      178   90         41        UFRN Biscoito
#> 25  Feminino    39    163      163   53         35     Unicamp Biscoito
#> 26  Feminino    45    168      168   62         37        UFMG Biscoito
#> 27  Feminino    20    157      157   59         34     Unicamp  Bolacha
#> 28 Masculino    31    174      174   75         39     Unicamp Biscoito
#> 29 Masculino    22    165      165   77         39     Unicamp  Bolacha
#> 30  Feminino    28    161      161   60         35        UFRN Biscoito
#> 31 Masculino    21    168      168   70         38        UFRN Biscoito
#> 32  Feminino    37    165      165   68         37        UFRN  Bolacha
#> 33  Feminino    56    165      165   61         37     Unicamp  Bolacha
#> 34 Masculino    44    160      160   79         36        UFMG Biscoito
#> 35  Feminino    39    165      165   92         38        UFMG Biscoito
#> 36  Feminino    27    155      155   58         36        UFMG  Bolacha
#> 37 Masculino    24    184      184   74         40        UFMG  Bolacha
#> 38 Masculino    31    168      168   68         38        UFMG  Bolacha
#> 39 Masculino    32    182      182   95         42        UFMG  Bolacha
#> 40  Feminino    24    160      160   70         35        UFRN Biscoito
#> 41 Masculino    32    173      173   82         40        UFRN Biscoito
#> 42  Feminino    22    165      165   63         36        UFRN  Bolacha
#> 43 Masculino    26    178      178   58         43        UFMG Biscoito
#> 44  Feminino    22    175      175   89         38        UFMG  Bolacha
#> 45 Masculino    24    175      175   63         39     Unicamp  Bolacha
#> 46  Feminino    24    155      155   50         34     Unicamp  Bolacha
#> 47  Feminino    21    161      161   65         36     Unicamp  Bolacha
#> 48  Feminino    27    152      152   60         35        UFMG Biscoito
#> 49  Feminino    30    163      163   90         37        UFMG Biscoito
#> 50 Masculino    25    175      175   90         39        UFMG Biscoito
#> 51 Masculino    29    167      167   75         38        UFRN Biscoito
#> 52  Feminino    39    162      162   50         35        UFMG Biscoito
#> 53  Feminino    28    173      173   87         38        UFMG Biscoito
#> 54 Masculino    25    179      179   95         40     Unicamp  Bolacha
#> 55  Feminino    18    160      160   52         36        UFMG Biscoito
#> 56 Masculino    22    181      181   86         41        UFMG  Bolacha
#> 57 Masculino    24    178      178   82         41        UFRN Biscoito
#> 58  Feminino    25    163      163   57         36        UFMG Biscoito
#> 59  Feminino    41    161      161   80         38        UFMG Biscoito
#> 60  Feminino    20    165      165  100         37        UFMG Biscoito
#> 61  Feminino    36    167      167   80         38     Unicamp  Bolacha
#> 62 Masculino    27    181      181   90         41     Unicamp  Bolacha
#>                 deslocamento    status esporte
#> 1  veículo próprio ou carona professor     Sim
#> 2  veículo próprio ou carona     aluno     Não
#> 3  veículo próprio ou carona     aluno     Sim
#> 4                      outro     aluno     Sim
#> 5                       à pé     aluno     Sim
#> 6         transporte público     aluno     Não
#> 7  veículo próprio ou carona professor     Não
#> 8                       à pé professor     Sim
#> 9         transporte público     aluno     Sim
#> 10        transporte público     aluno     Sim
#> 11 veículo próprio ou carona     aluno     Sim
#> 12 veículo próprio ou carona     aluno     Não
#> 13        transporte público     aluno     Sim
#> 14        transporte público     aluno     Sim
#> 15 veículo próprio ou carona     aluno     Não
#> 16 veículo próprio ou carona professor     Sim
#> 17        transporte público     aluno     Sim
#> 18 veículo próprio ou carona     aluno     Sim
#> 19        transporte público     aluno     Sim
#> 20        transporte público     aluno     Não
#> 21                      à pé     aluno     Não
#> 22 veículo próprio ou carona professor     Sim
#> 23        transporte público     aluno     Não
#> 24        transporte público     aluno     Sim
#> 25 veículo próprio ou carona professor     Sim
#> 26 veículo próprio ou carona professor     Sim
#> 27                      à pé     aluno     Não
#> 28 veículo próprio ou carona     aluno     Não
#> 29                      à pé     aluno     Não
#> 30        transporte público     aluno     Sim
#> 31 veículo próprio ou carona     aluno     Não
#> 32 veículo próprio ou carona professor     Não
#> 33 veículo próprio ou carona professor     Sim
#> 34        transporte público     aluno     Não
#> 35 veículo próprio ou carona     aluno     Não
#> 36                     outro     aluno     Sim
#> 37                      à pé     aluno     Não
#> 38                      à pé professor     Sim
#> 39                      à pé     aluno     Não
#> 40        transporte público     aluno     Sim
#> 41        transporte público     aluno     Sim
#> 42        transporte público     aluno     Sim
#> 43        transporte público     aluno     Não
#> 44                      à pé     aluno     Sim
#> 45        transporte público     aluno     Não
#> 46        transporte público     aluno     Não
#> 47                      à pé     aluno     Não
#> 48        transporte público     aluno     Não
#> 49        transporte público     aluno     Sim
#> 50 veículo próprio ou carona     aluno     Sim
#> 51 veículo próprio ou carona     aluno     Sim
#> 52 veículo próprio ou carona     aluno     Sim
#> 53        transporte público     aluno     Não
#> 54                      à pé     aluno     Sim
#> 55 veículo próprio ou carona     aluno     Não
#> 56                     outro     aluno     Não
#> 57 veículo próprio ou carona     aluno     Sim
#> 58 veículo próprio ou carona     aluno     Sim
#> 59 veículo próprio ou carona     aluno     Não
#> 60        transporte público     aluno     Não
#> 61                      à pé     aluno     Não
#> 62                      à pé     aluno     Não

ATENÇÃO! Note que o sinal == indica “igual a” na seleção por meio do pipe, enquando o sinal != indica diferente de.

É possível combinar filter e select em uma sequência de comandos, sempre sabendo que o resultado de uma linha n, através do pipe, será o input de uma linha subsequente n+1. Vejamos isso no próximo código, em que também pedimos para excluir uma pessoa que indicou 78 como número de calçado, o que é obviamente um erro.

O código abaixo opera da seguinte maneira:


# Selecionando as colunas de interesse
# Selecionando participantes de instituições diferentes de Outra
# Selecionando participantes com tamanho de calçado menor que 50

linguistas.total%>% 
  select(genero, idade, altura, peso, tamanho.pe, instituicao, dialeto, deslocamento, status, esporte)%>%
  filter(instituicao != "Outra")%>%
  filter(tamanho.pe < 50)
#>       genero idade altura peso tamanho.pe instituicao  dialeto
#> 1   Feminino    33    157   54         35        UFRN  Bolacha
#> 2   Feminino    23    167   67         36     Unicamp  Bolacha
#> 3   Feminino    49    158   50         33        UFMG Biscoito
#> 4   Feminino    23    164   54         36        UFMG Biscoito
#> 5  Masculino    28    166   75         38     Unicamp  Bolacha
#> 6  Masculino    24    174   57         41        UFMG Biscoito
#> 7   Feminino    41    160   60         36     Unicamp  Bolacha
#> 8  Masculino    35    172   85         42     Unicamp Biscoito
#> 9   Feminino    53    163   58         36        UFMG  Bolacha
#> 10  Feminino    33    167   64         38        UFRN Biscoito
#> 11  Feminino    25    151   54         35        UFMG Biscoito
#> 12  Feminino    19    160   50         36        UFMG Biscoito
#> 13  Feminino    21    156   63         37        UFMG Biscoito
#> 14  Feminino    28    161   57         35        UFMG Biscoito
#> 15  Feminino    26    151   56         35        UFRN Biscoito
#> 16  Feminino    39    168   70         37        UFRN Biscoito
#> 17 Masculino    31    180  102         41     Unicamp  Bolacha
#> 18  Feminino    23    150   56         34        UFRN Biscoito
#> 19  Feminino    21    165   57         37        UFRN Biscoito
#> 20  Feminino    21    157   62         37        UFMG  Bolacha
#> 21 Masculino    37    172   75         42        UFRN Biscoito
#> 22  Feminino    21    162   55         36        UFRN Biscoito
#> 23 Masculino    26    178   90         41        UFRN Biscoito
#> 24  Feminino    39    163   53         35     Unicamp Biscoito
#> 25  Feminino    45    168   62         37        UFMG Biscoito
#> 26  Feminino    20    157   59         34     Unicamp  Bolacha
#> 27 Masculino    31    174   75         39     Unicamp Biscoito
#> 28 Masculino    22    165   77         39     Unicamp  Bolacha
#> 29  Feminino    28    161   60         35        UFRN Biscoito
#> 30 Masculino    21    168   70         38        UFRN Biscoito
#> 31  Feminino    37    165   68         37        UFRN  Bolacha
#> 32  Feminino    56    165   61         37     Unicamp  Bolacha
#> 33 Masculino    44    160   79         36        UFMG Biscoito
#> 34  Feminino    39    165   92         38        UFMG Biscoito
#> 35  Feminino    27    155   58         36        UFMG  Bolacha
#> 36 Masculino    24    184   74         40        UFMG  Bolacha
#> 37 Masculino    31    168   68         38        UFMG  Bolacha
#> 38 Masculino    32    182   95         42        UFMG  Bolacha
#> 39  Feminino    24    160   70         35        UFRN Biscoito
#> 40 Masculino    32    173   82         40        UFRN Biscoito
#> 41  Feminino    22    165   63         36        UFRN  Bolacha
#> 42 Masculino    26    178   58         43        UFMG Biscoito
#> 43  Feminino    22    175   89         38        UFMG  Bolacha
#> 44 Masculino    24    175   63         39     Unicamp  Bolacha
#> 45  Feminino    24    155   50         34     Unicamp  Bolacha
#> 46  Feminino    21    161   65         36     Unicamp  Bolacha
#> 47  Feminino    27    152   60         35        UFMG Biscoito
#> 48  Feminino    30    163   90         37        UFMG Biscoito
#> 49 Masculino    25    175   90         39        UFMG Biscoito
#> 50 Masculino    29    167   75         38        UFRN Biscoito
#> 51  Feminino    39    162   50         35        UFMG Biscoito
#> 52  Feminino    28    173   87         38        UFMG Biscoito
#> 53 Masculino    25    179   95         40     Unicamp  Bolacha
#> 54  Feminino    18    160   52         36        UFMG Biscoito
#> 55 Masculino    22    181   86         41        UFMG  Bolacha
#> 56 Masculino    24    178   82         41        UFRN Biscoito
#> 57  Feminino    25    163   57         36        UFMG Biscoito
#> 58  Feminino    41    161   80         38        UFMG Biscoito
#> 59  Feminino    20    165  100         37        UFMG Biscoito
#> 60  Feminino    36    167   80         38     Unicamp  Bolacha
#> 61 Masculino    27    181   90         41     Unicamp  Bolacha
#>                 deslocamento    status esporte
#> 1  veículo próprio ou carona professor     Sim
#> 2  veículo próprio ou carona     aluno     Não
#> 3  veículo próprio ou carona     aluno     Sim
#> 4                      outro     aluno     Sim
#> 5                       à pé     aluno     Sim
#> 6         transporte público     aluno     Não
#> 7  veículo próprio ou carona professor     Não
#> 8                       à pé professor     Sim
#> 9         transporte público     aluno     Sim
#> 10        transporte público     aluno     Sim
#> 11 veículo próprio ou carona     aluno     Sim
#> 12 veículo próprio ou carona     aluno     Não
#> 13        transporte público     aluno     Sim
#> 14        transporte público     aluno     Sim
#> 15 veículo próprio ou carona     aluno     Não
#> 16 veículo próprio ou carona professor     Sim
#> 17        transporte público     aluno     Sim
#> 18        transporte público     aluno     Sim
#> 19        transporte público     aluno     Não
#> 20                      à pé     aluno     Não
#> 21 veículo próprio ou carona professor     Sim
#> 22        transporte público     aluno     Não
#> 23        transporte público     aluno     Sim
#> 24 veículo próprio ou carona professor     Sim
#> 25 veículo próprio ou carona professor     Sim
#> 26                      à pé     aluno     Não
#> 27 veículo próprio ou carona     aluno     Não
#> 28                      à pé     aluno     Não
#> 29        transporte público     aluno     Sim
#> 30 veículo próprio ou carona     aluno     Não
#> 31 veículo próprio ou carona professor     Não
#> 32 veículo próprio ou carona professor     Sim
#> 33        transporte público     aluno     Não
#> 34 veículo próprio ou carona     aluno     Não
#> 35                     outro     aluno     Sim
#> 36                      à pé     aluno     Não
#> 37                      à pé professor     Sim
#> 38                      à pé     aluno     Não
#> 39        transporte público     aluno     Sim
#> 40        transporte público     aluno     Sim
#> 41        transporte público     aluno     Sim
#> 42        transporte público     aluno     Não
#> 43                      à pé     aluno     Sim
#> 44        transporte público     aluno     Não
#> 45        transporte público     aluno     Não
#> 46                      à pé     aluno     Não
#> 47        transporte público     aluno     Não
#> 48        transporte público     aluno     Sim
#> 49 veículo próprio ou carona     aluno     Sim
#> 50 veículo próprio ou carona     aluno     Sim
#> 51 veículo próprio ou carona     aluno     Sim
#> 52        transporte público     aluno     Não
#> 53                      à pé     aluno     Sim
#> 54 veículo próprio ou carona     aluno     Não
#> 55                     outro     aluno     Não
#> 56 veículo próprio ou carona     aluno     Sim
#> 57 veículo próprio ou carona     aluno     Sim
#> 58 veículo próprio ou carona     aluno     Não
#> 59        transporte público     aluno     Não
#> 60                      à pé     aluno     Não
#> 61                      à pé     aluno     Não

Agora que selecionamos apenas as observações que queríamos, vamos salvar esse novo conjunto de dados com o nome de linguistas.edit. Na última linha do código, ainda usamos a função droplevels para que, nesse novo conjunto, sejam apagados os registros dos níveis que foram descartados a partir do filtros criados.


# Criando conjunto de dados

linguistas.edit = linguistas.total%>%
  select(genero, idade, altura, peso, tamanho.pe, instituicao, dialeto, deslocamento, status, esporte)%>%
  filter(instituicao != "Outra")%>%
  filter(tamanho.pe < 70)%>%
  droplevels()

Ao rodar o código, você verá o conjunto de dados linguistas.edit na sua área Environment.

É muito comum precisarmos limpar nosso conjunto de dados antes de analisá-los. Quando precisar fazer isso, evite criar planilhas diferentes para cada nova limpeza que precise fazer. O mais adequado é fazer as seleções e filtragens com o dplyr, comentando o porquê das escolhas. Se você preferir criar planilhas novas para cada filtragem, no futuro não saberá o que são todas aquelas planilhas.

Acredite em mim: é essa a minha sensação ao ver minha pasta do mestrado.

Figura 1.7: Pasta desorganizada com arquivos incompreensíveis

Tarefa 1: manipulação do conjunto de dados


# Código 1
linguistas.total%>%
  select(genero, idade, altura, esporte, tamanho.pe, status)%>%
  filter(instituicao != "UFMG")

# Código 2
linguistas.total%>%
  select(genero, idade, altura, instituicao, esporte, status)%>%
  filter(instituicao != "UFMG")

1.4.3 Dataframes: extraindo informações descritivas de seus dados

Antes mesmo de fazermos nossa análise, é útil olharmos nossos dados para extrairmos algumas medidas descritivas: médias, medianas, desvio-padrão, contagem, porcentagem etc. Para aplicar funções estatísticas nas colunas do conjunto de dados e gerar tabelas com estatística descritiva, utilizamos a função summarise. O raciocício é o mesmo que usamos até aqui: o pipe recebe o resultado de uma linha e usa como input da linha seguinte.


# Criando tabela com as médias de altura e tamanho de pé a partir do conjunto linguistas.edit

linguistas.edit%>%
summarise(mean(altura),
          mean(tamanho.pe))
#>   mean(altura) mean(tamanho.pe)
#> 1     166.0328         37.47541

# Mesmo resultado, mas com etiquetas
linguistas.edit%>%
summarise(media_altura = mean(altura),
          media_pe     = mean(tamanho.pe))
#>   media_altura media_pe
#> 1     166.0328 37.47541

Acima, os dois códigos retornam os mesmos valores: a média de altura é de 166cm, e a média do tamanho do pé é 37.4. A única diferença é que no segundo código decidimos nomear esses valores que estamos extraindo com os nomes media_altura e media_pe. Desse jeito nossos dados ficam mais organizados.

A função summarise fica mais interessante se utilizada em conjunto com group_by. Essa última função agrupa as observações de acordo com os níveis de uma variável categórica. Veja que, com o código abaixo, primeiro pedimos para agrupar os dados pelos valores de instituição (ou seja, pelas níveis UFRN, UFMG e Unicamp), e depois pedimos para extrair as médias de altura e tamanho de pé (mean()), e também para calcular o número de ocorrências (n()) em cada um desses níveis.


# Criando tabela agrupando os participantes por instituição e para extração das médias de altura e tamanho de pé e do número de participantes

linguistas.edit%>%
  group_by(instituicao)%>%
  summarise(media_altura = mean(altura),
            media_pe     = mean(tamanho.pe),
            quantidade   = n())
#> # A tibble: 3 x 4
#>   instituicao media_altura media_pe quantidade
#>   <fct>              <dbl>    <dbl>      <int>
#> 1 UFMG                166.     37.4         28
#> 2 UFRN                165.     37.4         17
#> 3 Unicamp             168.     37.8         16

Para quem trabalha em áreas em que é preciso cruzar informação de diversos níveis para fazer contagem de ocorrências (ou extrair sua estatística descritiva), a função summary() é uma excelente maneira de extrair tabelas que resumam os dados, pois permite a seleção de combinação de múltiplas variáveis. Vamos extrair a quantidade participantes por instituição e gênero.


# Criando tabelas agrupando participantes por instituição e gênero para saber o n de cada grupo

linguistas.edit%>%
  group_by(instituicao, genero)%>%
  summarise(qtdd = n())
#> # A tibble: 6 x 3
#> # Groups:   instituicao [3]
#>   instituicao genero     qtdd
#>   <fct>       <fct>     <int>
#> 1 UFMG        Feminino     20
#> 2 UFMG        Masculino     8
#> 3 UFRN        Feminino     11
#> 4 UFRN        Masculino     6
#> 5 Unicamp     Feminino      8
#> 6 Unicamp     Masculino     8

Tarefa: descrição dos dados

É possível combinar as funções que vimos até agora em um mesmo código. Olhe os códigos abaixo, tente adivinhar qual seria seu output e crie uma descrição para eles .


# Código 1
linguistas.total%>%
  filter(instituicao == "Unicamp")%>%
  group_by(genero)%>%
  summarize(media = mean(altura))

# Código 2
linguistas.total%>%
  group_by(status, deslocamento)%>%
  summarise(qtt = n())

1.5 Explorando dados graficamente: ggplot2

A exploração gráfica de dados é crucial para entendermos sua distribuição e decidirmos que teste estatístico usar. Na próxima seção falaremos um pouco mais sobre distribuição de dados, mas aqui aprenderemos como visualizar graficamente nossos dados com um pacote chamado ggplot2.

Podemos dizer que gráficos nos ajudam a ver a relação entre uma variável resposta e uma variável explicativa. Se você quiser usar uma linguagem com menos relação de causalidade, pode chamar essas variáveis de variável resposta e variável independente (voltaremos a esses termos na seção 2).

Pense em como você tentaria demonstrar graficamente as respostas às seguintes perguntas:

- qual a relação entre altura e tamanho do pé?

- qual a relação entre gênero e altura?

- qual a relação entre a instituição e a escolha por bolacha/biscoito?

Em todos esses exemplos, temos a relação entre uma variável X que (suspeitamos) explique uma variável Y. Esperamos que a altura explique o tamanho do pé (quanto mais alto, maior o pé), que gênero explique altura (gênero masculino prevê maiores alturas) e que a instituição explique preferências por usar as palavras bolacha ou biscoito (biscoito mais comum na UFRN, bolacha mais comum na Unicamp).

O pacote de visualização gráfica de dados ggplot2 tem esse nome porque se basea no livro Grammar of Graphics, de Leland Wilkinson. A ideia principal é criar gráficos como se eles fossem frases de uma língua, em que cada elemento do gráfico é uma palavra. Ou seja, trabalha-se com o conceito de gramática de gráficos (por isso o gg em ggplot2).

Uma outra maneira de entender a função ggplot e sua sintaxe é vê-la como a tela em branco de um quadro: começamos pintando os aspectos ao fundo, mais estruturais do quadro, e depois vamos adicionando camadas (agradeço à professora Livia Oushiro por ter me apresentado essa analogia!).

Os gráficos criados com esta ferramenta são, em geral, mais bonitos do que os gráficos tradicionais do R ou de outras ferramentas similares. Uma vez que você entenda sua sintaxe básica, é muito fácil editar o gráfico em termos de cores, contornos, variáveis etc.

1.5.1 ggplot: Sintaxe Básica

Para fazer um gráfico usando o ggplot2, primeiro precisamos que nossos dados estejam em um dataframe, pois não é possível trabalhar diretamente com dados de um vetor. Esse é o caso do conjunto de dados com que estamos trabalhando aqui.

DICA! Ao construir um dataframe, evite usar acentuação, caracteres especiais ou espaços nos nomes de suas variáveis. Isso evitará que você tenha problemas posteriormente com problemas de codificação.

A sintaxe básica do ggplot se dá através do comando abaixo, que define duas características importantes de um gráfico:


# sintaxe básica

ggplot(dados, aes(x = variável_explicativa, y = variável_resposta))

Todo tipo de gráfico que vamos construir parte desse código, então sua primeira tarefa é sempre pensar qual é sua variável explicativa e qual é sua variável resposta. Vejamos algumas opções de visualização para as questões colocadas anteriormente.

1.5.2 Gráficos de dispersão

Considere a seguinte pergunta:

Ao colocarmos essa pergunta, estamos questionando se o tamanho de uma pessoa explica o tamanho de pé que ela tem. Temos, então, nossa variável explicativa (altura) e a variável resposta (tamanho do pé), e as duas são variáveis numéricas. Uma maneira de visualizar a relação entre duas variáveis de natureza numérica é através de um gráfico de dispersão, que indica cada observação com um ponto na coordenada em que os valores das duas variáveis se cruzam. Começamos preenchendo a sintaxe básica do ggplot com nossas variáveis.



# criando a estrutura básica do nosso gráfico

ggplot(linguistas.edit, aes(x = altura, y = tamanho.pe))

Se você tentou rodar o código acima, recebeu uma mensagem de erro. O erro ocorreu porque é preciso informar a geometria do gráfico, ou seja, o modo como queremos dispôr nossa informação: colunas, linhas, pontos etc.

A geometria de um gráfico de dispersão (adequado para duas variáveis numéricas) é geom_point. Inserimos um sinal + ao fim da primeira linha para indicar que continuamos “pintando” nosso gráfico na linha seguinte.


# adicionando a camada de geometria, indicando geometria de pontos

ggplot(linguistas.edit, aes(x = altura, y = tamanho.pe))+
  geom_point()

Agora sim temos um gráfico de dispersão que mostra que, a medida que as pessoas ficam mais altas, o tamanho de seus pés aumenta.

Devemos lembrar que dados, estética e geometria são três camadas obrigatórias de todo gráfico. Se você deixar de fora um desses elementos, seu código retornará uma mensagem de erro.

Continuemos editando eesse gráfico para deixá-lo mais informatimo. É possível que haja sobreposição dos pontos, e portanto seria interessante mexer nas características dos pontos para adicionar transparência (alpha) e para modificar seu tamanho (size).


# modificando os elementos introduzidos pela camada geometria

# o valor de alpha vai de 0 (completamente transparente) a 1 (completamente opaco)

ggplot(linguistas.edit, aes(x = altura, y = tamanho.pe))+
  geom_point(size = 3, alpha = 0.3) 

De fato, havia sobreposição. Há mais de uma pessoa com 160cm que calça 36.

Ainda é possível adicionar um novo agrupamento de dados a partir dos elementos da geometria. Suponha que eu queira identificar, no elementro de geometria, o gênero do indivíduos. Preciso fazer isso indicando a estética dessa geometria a partir da variável genero. Afinal, como vimos, a estética é responsável por informar as variáveis que vamos usar para definir cores, plotagem, agrupamento etc.


# agrupando dados por nova variável na camada de geometria por meio de cor

ggplot(linguistas.edit, aes(x = altura, y = tamanho.pe))+
  geom_point(size = 3, alpha = 0.3, aes(color = genero))

Se prefere não usar cores para isso, pode usar o formato dos elementos introduzidos na geometria.


# agrupando dados por nova variável na camada de geometria por meio de formato

ggplot(linguistas.edit, aes(x = altura, y = tamanho.pe))+
  geom_point(size = 3, alpha = 0.3, aes(shape = genero))

Tarefa: gráficos de dispersão


ggplot(linguistas.edit, aes(x = altura, y = peso))+
  geom_point(size = 3, alpha = 0.6, colour = "red")

1.5.3 Boxplots

Até o momento, vimos como mostrar graficamente a relação entre duas variáveis numéricas. No entanto, a pergunta abaixo indica que queremos ver a relação entre uma variável explicativa categórica (gênero) e uma variável resposta numérica (altura).

Para ver como uma variável categórica influencia a distribuição das observações de uma variável numérica, podemos usar um tipo de gráfico chamado boxplot. O boxplot, portanto, é a geometria do nosso gráfico.


# Criando um boxplot

ggplot(linguistas.edit, aes(x = genero, y = altura))+
  geom_boxplot()

Aqui assumimos que você já conhece e sabe ler um boxplot, por isso não explicaremos o que ele indica. Se você não souber, procure informações em livros ou na internet3. Não vamos usar muito boxplot no tutorial, mas é bom que você o conheça.

Para editar a aparência do boxplot, podemos usar os comandos que vimos anteriormente, mas há algumas diferenças. Rodando o código abaixo, você verá que color, alpha e shape alteram a geometria do gráfico, que nesse caso é a forma do boxplot, mas não o seu preenchimento.

DICA! É possível escolher as cores que você quer para um gráfico selecionando seu código hexadecimal. Abaixo usamos o código #8bd5c4, que corresponde a um tom de verde.


# personalizando o gráfico: note que é possível informar a cor por sua notação RGB

ggplot(linguistas.edit, aes(x = genero, y = altura))+
  geom_boxplot(alpha = 0.4, size = 4, color = "#8bd5c4")

O gráfico que acabamos de fazer é meio esquisito porque, na verdade, nós não queremos mudar a cor do boxplot, mas sim o seu preenchimento. Para fazermos isso, indicamos a cor que queremos com fill.


# personalizando o gráfico: note que é possível informar a cor por sua notação RGB

ggplot(linguistas.edit, aes(x = genero, y = altura))+
  geom_boxplot(fill = "#8bd5c4")

E se quisermos ver as diferenças de gênero/altura por instituições? Nesse caso, é possível inserir informação sobre a variável instituicao na estética da geometria do gráfico. Note que, mais uma vez, indicamos fill, e não color, pois nesse caso trata-se do preenchimento da geometria.


# indicando preenchimento da geometria pela variável genero

ggplot(linguistas.edit, aes(x = genero, y = altura))+
  geom_boxplot(aes(fill = instituicao))

Outra maneira de fazer a distinção por gênero seria adicionar uma quarta camada no gráfico, chamada facet. Essa camada é útil para dividir informações do gráfico por uma variável e facilitar a comparação.

Note que o gráfico que fizemos acima permite a comparação de altura para homens ou mulheres entre as instituições, mas é difícil visualizar se as diferenças entre os dois gêneros varia de instituição para instituição.

Adicionando uma quarta camada, chamada facet, o que foi indicado nas linhas anteriores do gráfico se dividirá pela variável indicada para criar os grupos (ou facetas).


# Boxplot mostrando altura para cada gênero; um painel por instituição

ggplot(linguistas.edit, aes(x = genero, y = altura))+
  geom_boxplot()+
  facet_wrap(~ instituicao)

É possível cruzar variáveis categóricas em facet para criar mais grupos. Abaixo, queremos ver a altura de homens e mulheres por instituição, também fazendo uma distinção entre aqueles que praticam esportes e que não praticam. Esse cruzamento de variáveis não é muito informativo, não temos nenhuma hipótese sobre porque a distribuição de altura mudaria em cada um desse grupos, mas mostramos essa possibilidade aqui apenas para vermos como facet funciona.


# criar gráficos nos 6 agrupamentos do cruzamento de instituição e esporte

# determinar número de colunas = 2 ('ncol = 2') nos painéis do facet para facilitar comparação (o default seria 3)

ggplot(linguistas.edit, aes(x = genero, y = altura))+
  geom_boxplot()+
  facet_wrap(~ instituicao + esporte, ncol = 2)

Também é possível usar facet para outros gráficos, como os gráficos de dispersão que fizemos anteriormente.


# Criando gráficos de dispersão com painéis diferentes para cada gênero

ggplot(linguistas.edit, aes(x = altura, y = tamanho.pe))+
  geom_point(size = 3, alpha = 0.3)+
  facet_wrap(~ genero)

Se é melhor mostrar variáveis por meio de diferentes cores em um mesmo gráfico ou se é melhor separar os gráficos por painéis diferentes usando facet é uma decisão que cabe a você!

ATENÇÃO! Quem desenha o gráfico é o R, mas quem pensa é você! Pondere bem qual é a melhor maneira de apresentar suas informações graficamente e depois escreva o seu código.

Tarefa: boxplot


ggplot(linguistas.edit, aes(x = status, y = idade))+
  geom_boxplot(aes(fill = instituicao))

1.5.4 Gráfico de barras

Em algumas situações, nossa variável resposta também tem natureza categórica. É o que observamos na seguinte pergunta:

No caso de duas variáveis categóricas (dialeto e instituição), usa-se um gráfico de barras para indicar a quantidade ou porcentagem de uma variável em função de outra. Os códigos base do R para fazer gráficos de barra são um pouco complicados, e mesmo o ggplot2 não tem uma sintaxe amigável com a geometria geom_bar. No entanto, uma maneira simples de fazer um gráfico de barras usando o ggplot2 é combinar o uso desse pacote com o dplyr.

A combinação entre esses dois pacotes ocorre quando processamos e agrupamos os dados que queremos usando o dplyr e usamos o seu resultado para criar um gráfico. Na pergunta que nos colocamos, queremos saber o número de pessoas que fala bolacha ou biscoito em cada instituição. Comecemos por um passo simples: criar uma tabela com o número de ocorrências de cada instituição. Já sabemos fazer isso.


# Tabela indicando frequência absoluta por instituição

linguistas.edit%>%
  group_by(instituicao)%>%
  summarise(quantidade = n())
#> # A tibble: 3 x 2
#>   instituicao quantidade
#>   <fct>            <int>
#> 1 UFMG                28
#> 2 UFRN                17
#> 3 Unicamp             16

Para que essa tabela vire um gráfico, basta que acrescentemos o código do ggplot indicando que queremos nossa variável explicativa no eixo x (a instituição) e o número de ocorrências no eixo y. No lugar onde costumamos informar o conjunto de dados, inserimos um ponto . para indicar que o input vem do código anterior.


# Gráfico indicando frequência absoluta por instituição

linguistas.edit%>%
  group_by(instituicao)%>%
  summarise(quantidade = n())%>%
  ggplot(., aes(x = instituicao, y = quantidade))

A essa altura você já deve ter percebido que o código acima não gerou um gráfico de barras porque esquecemos de indicar sua geometria. Fazemos isso agora com a geometria geom_col:


# Gráfico de barra (coluna) indicando frequência absoluta por instituição

linguistas.edit%>%
  group_by(instituicao)%>%
  summarise(quantidade = n())%>%
  ggplot(., aes(x = instituicao, y = quantidade))+
  geom_col()

O gráfico está feito, mas não mostra a proporção de quem fala bolacha ou biscoito em cada instituição. Para isso, vamos ter que pedir que nossa tabela faça o agrupamento cruzando as informações de instituicao e dialeto dialeto. Fazemos isso alterando a segunda linha do código.


# Gráfico de barra (coluna) indicando frequência absoluta por instituição x dialeto

linguistas.edit%>%
  group_by(instituicao, dialeto)%>%
  summarise(quantidade = n())%>%
  ggplot(., aes(x = instituicao, y = quantidade))+
  geom_col()

Continuamos sem ver a distribuição entre os níveis da variável dialeto. Isso ocorre porque não indicamos, na estética, como queremos ver essa variável representada. Digamos que queremos vê-la no preenchimento das barras. Já sabemos que a função fill = faz isso. Inserimos essa informação na geometria do gráfico.


# Gráfico de barra (coluna) indicando frequência absoluta por instituição x dialeto com fill

linguistas.edit%>%
  group_by(instituicao, dialeto)%>%
  summarise(quantidade = n())%>%
  ggplot(., aes(x = instituicao, y = quantidade, fill = dialeto))+
  geom_col()

Podemos ainda colocar as barras lado a lado (o default do ggplot é empilhar as barras).


# Gráfico de barra (coluna) indicando frequência absoluta por instituição x dialeto com fill

linguistas.edit%>%
  group_by(instituicao, dialeto)%>%
  summarise(quantidade = n())%>%
  ggplot(., aes(x = instituicao, y = quantidade, fill = dialeto))+
  geom_col(position = "dodge")

Se quisermos um gráfico indicando o número de ocorrências, já temos o resultado. No entanto, às vezes queremos que a indicação venha em frequência relativa ou porcentagem para normalizar o fato de termos muito mais dados em uma condição (UFMG, no caso) do que em outras.

Para isso, usamos a função mutate() no dplyr para gerar um novo valor através da tabela que construímos antes. Nós vamos chamar esse valor de frequencia, e ele será igual o valor de quantidade dividido pela soma total de todos os valores de quantidade (esse é o cálculo que fazemos para extrair frequência relativa).


# Gráfico de barra (coluna) indicando frequência absoluta por instituição x dialeto com fill

linguistas.edit%>%
  group_by(instituicao, dialeto)%>%
  summarise(quantidade = n())%>%
  mutate(frequencia = quantidade/sum(quantidade))
#> # A tibble: 6 x 4
#> # Groups:   instituicao [3]
#>   instituicao dialeto  quantidade frequencia
#>   <fct>       <fct>         <int>      <dbl>
#> 1 UFMG        Biscoito         20      0.714
#> 2 UFMG        Bolacha           8      0.286
#> 3 UFRN        Biscoito         14      0.824
#> 4 UFRN        Bolacha           3      0.176
#> 5 Unicamp     Biscoito          3      0.188
#> 6 Unicamp     Bolacha          13      0.812

A tabela nos indica que 71.4% dos linguistas da UFMG falam biscoito e 28.6% falam bolacha. Isso é muito mais informativo que apenas indicar o número de ocorrências.

Para fazer um gráfico de barras, é só continuar com o código inserindo a sintaxe do ggplot.


# Gráfico de barra (coluna) indicando frequência relativa por instituição x dialeto com fill

linguistas.edit%>%
  group_by(instituicao, dialeto)%>%
  summarise(quantidade = n())%>%
  mutate(frequencia = quantidade/sum(quantidade))%>%
  ggplot(., aes(x = instituicao, y = frequencia, fill = dialeto))+
  geom_col(position = "dodge")

Usando a frequência relativa, percebemos que não há muita diferença entre UFMG e UFRN. Se quisermos que nosso eixo y indique a porcentagem dos dados, é só acrescentar essa informação no gráfico.


# Gráfico de barra (coluna) indicando porcentagem por instituição x dialeto com fill

linguistas.edit%>%
  group_by(instituicao, dialeto)%>%
  summarise(quantidade = n())%>%
  mutate(frequencia = quantidade/sum(quantidade))%>%
  ggplot(., aes(x = instituicao, y = frequencia, fill = dialeto))+
  geom_col(position = "dodge")+
  scale_y_continuous(labels=scales::percent)

Se parece muita coisa para lembrar, não se preocupe! Uma vez que você saiba o que quer fazer e conheça o básico de R, saberá buscar exemplos de códigos na internet (ou mesmo neste tutorial) e ajustar o que precisa.

DICA! Pense que aprender uma linguagem de programação é como aprender uma língua estrangeira: quanto mais você usar, mais fácil fica de lembrar as palavras e a sintaxe da sentença que você quer construir. No entanto, quem está no nível básico também consegue fazer muita coisa consultado livros e dicionários. Não tenha receio de consultar códigos prontos enquanto não consegue escrevê-los do zero!

Tarefa: gráfico de barras


linguistas.edit%>%
  group_by(instituicao, status, deslocamento)%>%
  summarise(quantidade = n())%>%
  mutate(frequencia = quantidade/sum(quantidade))%>%
  ggplot(., aes(x = status, y = frequencia, fill = deslocamento))+
  geom_col()+
  scale_y_continuous(labels=scales::percent)+
  facet_wrap(~instituicao)

DICA! Tenha atenção quando for usar facet_wrap e group_by para um gráfico. Quando for construir a tabela no group_by, informe primeiro a variável que vai no facet_wrap, depois a que vai no eixo x e, por fim, a que vai no preenchimento de cores das barras.


# Gráfico de barra mostrando a proporção (em %) de pessoas que faz atividade física em cada uma das instituições

linguistas.edit%>%
  group_by(instituicao, esporte)%>%
  summarise(quantidade = n())%>%
  mutate(frequencia = quantidade/sum(quantidade))%>%
  ggplot(., aes(x = instituicao, y = frequencia))+
  geom_col()

Não pare por aqui!

Vimos apenas algumas das possibilidades de customização de gráficos com o ggplot. Você pode alterar as cores, temas e fontes do gráfico, colocar legendas, barras de erros e outras informações que desejar. A internet e a grande comunidade de R Users são suas amigas nessa hora!

1.6 Prática

O conjunto de dados da planilha pronome.csv é um subconjunto dos dados do experimento descrito em Godoy et al. (2018) (voltaremos a esse estudo na Seção 5).

Uma das hipóteses desse estudo era a de que a interpretação do pronome ambíguo das sentenças (1) e (2) seria influenciada pelo aspecto perfectivo (“passou”) ou imperfectivo (“estava passando”) do verbo da sentença anterior. A probabilidade de escolher o referente no papel temático de alvo (e.g. Rubens) seria maior em (1) que em (2).

  1. Augusto passou a bola para Rubens. Ele…
  2. Augusto estava passando a bola para Rubens. Ele…

Para testar essa hipótese, os autores criaram sentenças semelhantes a essas e pediram para os participantes criarem continuações. Depois, analisaram as respostas para identificar se a interpretação do pronome retomava a fonte (como Augusto) ou o alvo (Rubens) e anotaram essas respostas numa planilha que você pode acessar importando o conjunto de dados pronomes.csv.

O conjunto de dados contém 6 colunas:

participante, com identificação dos participantes da pesquisa;

item, com identificação de 16 histórias utilizadas como itens experimentais;

frase, com as frases utilizadas no experimento;

aspecto, com identificação das condições de aspecto verbal: perfectivo (perfective) e imperfectivo (imperfective);

classe, uma condição experimental que entenderemos na Seção 5;

interpretacao: interpretação do pronome tal qual anotado pelos pesquisadores, e que indica interpretação de fonte (fonte), alvo (alvo) ou ambígua (ambiguo).

Para ver se a hipótese dos autores foi corroborada pelos dados, você deverá:

REFERÊNCIAS

Godoy, M. C.; Weissheimer, J. ; Mafra, M. A. (2018) When Grammar Meets Pragmatics: Subject Preference and Coherence Relations in Brazilian Portuguese Pronoun Interpretation. Journal of Portuguese Linguistics, v. 17, p. 17, doi: 10.5334/jpl.197


  1. Veja uma discussão sobre o tema em https://www.theatlantic.com/science/archive/2018/11/psychologys-replication-crisis-real/576223/.

  2. Veja uma discussão sobre o tema em https://www.psychologicalscience.org/observer/preregistration-becoming-the-norm-in-psychological-science

  3. Uma boa explicação pode ser achada em http://www.portalaction.com.br/estatistica-basica/31-boxplot